package com.order.service;

import com.common.domain.Pages.PageResult;
import com.order.domain.dto.CourseBuyDto;
import com.order.domain.dto.OrderPageDto;
import com.order.domain.pojo.Order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.order.domain.vo.OrderDetailVo;
import com.order.domain.vo.OrderListVo;

import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author 小杰大人
 * @since 2025-09-29
 */
public interface IOrderService extends IService<Order> {
    /**
     * 生成订单
     * 分布式锁控制：
     * @param courseBuyDto 课程数据
     * @return 支付表单
     */
    String generateOrder(CourseBuyDto courseBuyDto);

    /**
     * 去支付
     * @param orderId   订单Id
     * @return 支付表单
     */
    String toPayment(Long orderId);

    /**
     * 订单支付成功
     * @param orderNo
     */
    void paySuccess(String orderNo);

    /**
     * 分页查询订单列表
     * @return
     */
    PageResult<OrderListVo> pageList(OrderPageDto orderPageDto);

    /**
     * 订单详情
     * @param orderId
     * @return
     */
    OrderDetailVo detailById(Long orderId);

    /**
     * 获取指定用户的已成功购买的课程id
     * @param userId
     * @return
     */
    List<Long> getPurchasedCourseIds(Long userId);

    /**
     * 支付成功后修改订单状态为已完成
     * @param orderNo
     */
    void paidToCompleted(String orderNo);

    /**
     * 取消订单
     * @param orderId 订单Id
     * @param isSystem 是否系统取消
     */
    void cancel(Long orderId, boolean isSystem);

    /**
     * 发起订单退款
     *
     * @param orderId
     * @param reason
     */
    void refund(Long orderId, String reason);

    /**
     * 订单退款成功
     * @param orderNo
     */
    void refundSuccess(String orderNo);

    /**
     * 订单退款失败
     * @param orderNo
     */
    void refundFail(String orderNo);

}
